package gulimall.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import gulimall.entity.Category;
import gulimall.service.ICategoryService;
import gulimall.utils.R;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 商品三级分类 前端控制器
 * </p>
 *
 * @author HLF
 * @since 2022-04-23
 */
@RestController
@RequestMapping("/product/category")
public class CategoryController {
    @Resource
    private ICategoryService categoryService;

    /**
     * 查询出所有分类及其子分类，以树形结构组装起来
     */
    @GetMapping("/list/tree")
    public R listTree() {
        List<Category> listTree = categoryService.listWithTree();
        return R.ok().put("categorys", listTree);
    }

    /**
     * 删除分类
     *
     * @RequestBody: 获取请求体，必须发送POST请求
     * SpringMVC自动将请求体的数据（json），转为对应的对象
     */
    @PostMapping("/delete")
    public R delete(@RequestBody Long[] catIds) {
        //boolean b = categoryService.removeByIds(Arrays.asList(catIds));
        //删除之前需要检查当前菜单是否被其他地方引用，使用逻辑删除
        int i = categoryService.removeMenusByIds(catIds);

        if (i > 0) {
            return R.ok("删除成功").put("删除行数", i);
        } else {
            return R.error("删除失败");
        }
    }

    /**
     * 批量删除选中的节点
     *
     * @param catIds 所有选中的节点的catId数组
     * @return
     */
    @PostMapping("/deleteBatch")
    public R deleteBatch(@RequestBody List<Long> catIds) {
        boolean b = categoryService.removeBatchByIds(catIds);
        if (b) {
            return R.ok("批量删除成功！");
        } else {
            return R.error(500, "批量删除失败！");
        }
    }

    /**
     * 添加一个子分类
     */
    @PostMapping("/addChildren")
    public R addChildren(@RequestBody Category category) {
        String name = category.getName();
        QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
        //❗️注意：这里排除掉“其他”分类，允许“其他”分类重复
        queryWrapper.lambda().eq(Category::getName, name).ne(Category::getName, "其他");
        Category one = categoryService.getOne(queryWrapper);
        //先从数据库中查询要添加的分类是否已经存在
        if (one != null) {
            return R.error(500, "添加分类失败！该分类已经存在");
        } else {
            boolean save = categoryService.save(category);
            if (save) {
                return R.ok("添加分类成功!");
            } else {
                return R.error(500, "添加分类失败！");
            }
        }
    }

    /**
     * 修改分类
     *
     * @param category 当前需要修改的分类
     * @return
     */
    @PostMapping("/update")
    public R update(@RequestBody Category category) {
        String name = category.getName();//前台输入的分类name
        String preName = category.getPreName();//进入修改对话框时显示的name，修改输入框的name这个preName不会改变
        QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
        //查询条件：查询修改后的分类名是否存在于数据库,排除掉未修改name只修改图标和计量单位的情况
        //❗️注意：这里排除掉“其他”分类，允许“其他”分类重复
        queryWrapper.eq("name", name).ne("name", "其他");
        List<Category> one = categoryService.list(queryWrapper);
        //先从数据库中查询要添加的分类是否已经存在
        //排除该情况：未修改分类名，只修改了分类图标或者分类的计量单位
        if (one != null && one.size() > 0 && !Objects.equals(name, preName)) {
            return R.error(500, "修改分类失败！该分类已存在");
        } else {
            //boolean b = categoryService.updateById(category);

            //级联更新，同步更新其他关联表中的字段
            boolean b = categoryService.updateCascader(category);
            if (b) {
                return R.ok("修改分类成功！");
            } else {
                return R.error(500, "修改分类失败！");
            }
        }
    }

    @GetMapping("/getById")
    public R getById(@RequestParam Long catId) {
        Category byId = categoryService.getById(catId);
        if (byId != null) {
            return R.ok().put("data", byId);
        } else {
            return R.error(500, "不存在该分类！请尝试刷新浏览器");
        }
    }

    /**
     * 修改拖拽节点的顺序和层级关系
     *
     * @param categories 需要修改的节点集合
     * @return
     */
    @PostMapping("/update/sort")
    public R updateSort(@RequestBody List<Category> categories) {
        boolean b = categoryService.updateBatchById(categories);
        if (b) {
            return R.ok("分类顺序修改成功！");
        } else {
            return R.error("分类顺序修改失败！");
        }
    }


    /**
     * 通过三级分类的叶子节点的catId获取到父节点以及顶级父节点的所有catId
     * 作用：点击修改按钮后回显级联选择器中的数据
     *
     * @param catId
     * @return
     */
    @GetMapping("/getCatIdsByLeaf/{catId}")
    public R getCatIdsByLeaf(@PathVariable String catId) {
        /**
         * @version 1.0
         */
        /*List<Long> catIds = new ArrayList<>();
        Category leaf = categoryService.getById(catId);
        Integer catLevel = leaf.getCatLevel();
        if (catLevel == 3) {
            Long catId2 = leaf.getParentCid();//二级分类的catId
            Category category2 = categoryService.getById(catId2);
            Long catId1 = category2.getParentCid();//一级分类的catId
            catIds.add(catId1);
            catIds.add(catId2);
            catIds.add(Long.valueOf(catId));
            return R.ok().put("catIds", catIds);
        } else if (catLevel == 2) {
            Long catId1 = leaf.getParentCid();
            catIds.add(catId1);
            catIds.add(Long.valueOf(catId));
            return R.ok().put("catIds", catIds);
        } else {
            catIds.add(Long.valueOf(catId));
            return R.ok().put("catIds", catIds);
        }*/

        /**
         * @version 2.0
         */
        List<Long> catIds = categoryService.getCatIdsByLeaf(Long.valueOf(catId));
        return R.ok().put("catIds", catIds);
    }
}
